#include <iostream>
#include <string>
#include "Cpu.h"
#include "SingleLinkList.h"

/// 我不会也不理解 extern关键字。
//extern ly::Cpu cpu;

/**
 * TODO C++其实不是支持 Unicode字符集的，而Java是支持 Unicode字符集的。
 *  在这一点上确实C++做得没有Java好。因为也是历史原因，Unicode Character Set
 *  是C++之后才有的。所以，涉及到了文字，就尽量使用std::string。
 *
 * @return
 */
int main() {
    std::cout << "Hello, World!" << std::endl;
    std::cout << "这是UTF-8编码文件！V" << std::endl;

//    wchar_t wcharacter{L'留'};
//    std::wcout << wcharacter << std::endl;
//    std::cout << std::to_string(wcharacter) << std::endl;

//    char16_t character16{u'中'};
//    std::cout << character16 << std::endl;
//    std::cout << std::to_string(character16) << std::endl;


    ly::Cpu cpu{4};
    std::cout << cpu << std::endl;
    std::cout << cpu.toString() << std::endl;


//    std::cout << ly::cpu << std::endl;
//    std::cout << ly::cpu.toString() << std::endl;

    int integer{1024};
    int& refInteger{integer};
    std::cout << integer << std::endl;
    std::cout << refInteger << std::endl;

    refInteger = 2;
    std::cout << integer << std::endl;
    std::cout << refInteger << std::endl;

    int integerValue{refInteger};
    std::cout << integer << std::endl;
    std::cout << refInteger << std::endl;
    std::cout << integerValue << std::endl;

    int& refInt{refInteger};
    std::cout << integer << std::endl;
    std::cout << refInteger << std::endl;
    std::cout << integerValue << std::endl;
    std::cout << refInt << std::endl;

    int value{refInt};
    std::cout << integer << std::endl;
    std::cout << refInteger << std::endl;
    std::cout << integerValue << std::endl;
    std::cout << refInt << std::endl;
    std::cout << value << std::endl;

    int speedValue{cpu.getSpeed()};
//    int& speed{cpu.getSpeed()};

    std::cout << "================================================" << std::endl;

    int* ptrInteger{&integer};
    std::cout << *ptrInteger << std::endl;
    ptrInteger = nullptr;
    // 输出为0。
    std::cout << ptrInteger << std::endl;
    // 加*会产生内存泄漏。
//    std::cout << *ptrInteger << std::endl;
    ptrInteger = &integer;

    if (ptrInteger) {
        std::cout << "并不为空e" << std::endl;
    } else {
        std::cout << "空指针n" << std::endl;
    }

    int integerLiteral{42};
    int* ptrIntegerLiteral{nullptr};
    int*& refPtrInteger{ptrIntegerLiteral};

    refPtrInteger = &integerLiteral;
    std::cout << *refPtrInteger << std::endl;
    *refPtrInteger = 0;
    std::cout << *refPtrInteger << std::endl;
    std::cout << *ptrIntegerLiteral << std::endl;




/*    // 错误。
//    int& speed{cpu.getSpeed()};
    // 正确。
    const int& refSpeed{cpu.getSpeed()};
    std::cout << refSpeed << std::endl;


//    decltype(cpu.getSpeed()) speed{cpu.getSpeed()};
//    // TODO 这里什么都输出不了！！！！
//    std::cout << speed << std::endl;

    decltype(refSpeed + 0) speed{cpu.getSpeed()};
    /// 可以输出了。
    std::cout << speed << std::endl;*/


    std::cout << "====================================================" << std::endl;

    int i{42}, * p{&i}, & r{i};

    std::cout << "====================================================" << std::endl;
    ly::SingleLinkList::Node node(4);
    ly::SingleLinkList singleLinkList(&node, 1);

    std::cout << singleLinkList.toString() << std::endl;
    std::cout << node.toString() << std::endl;


    return 0;
}
